Cloudflare WorkerdをBazelでビルドして動かしてみる
Introduction
先日、CloudflareはCloudflare Workersと同じコードに基づく
JavaScript/Webassemblyランタイム、「workerd」(worker deeとよむそうな)
のベータ版をリリースしました。
本稿ではworkerdをビルドしてサンプルを動かしてみます。
workerd?
JavaScript/Webassemblyのランタイムです。
workerdを使うことで、
Cloudflare Workersで実行するアプリケーションをセルフホストできます。
すでにwranglerには、wrangler dev時にworkerdで動くモードも組み込まれてます。
(いままではMiniflareで動いてた)
同じランタイムで動くほうが正確にシュミレートできるのは明白なので、
そのうち完全にworkerdに置き換わると思われます。
Environment
今回使用する環境です。
- OS : MacOS 12.4
Setup
workerdを動かすのは簡単です。
npm/yarnでインストールするだけでも動くのですが、
ここではBazelを使ってビルドしてみましょう。
※BazelはGoogle製のビルドツール
BazelをHomebrewでインストールします。
bazelコマンドが実行できればOKです。
% brew install bazel % bazel --version bazel 5.3.0-homebrew
workerdのリポジトリをcloneしてBazelでビルドします。
% git clone https://github.com/cloudflare/workerd.git % cd workerd #けっこう時間がかかる % bazel build -c opt //src/workerd/server:workerd
ビルドが成功するとbazel-bin/src/workerd/server以下にworkerdモジュールができます。
また、samplesディレクトリ以下にはそのまま動作確認できるプログラムがあるので、
動かしてみましょう。
samples/helloworldにあるconfig.capnpがworkersの設定を記述するファイルです。
#config.capnp using Workerd = import "/workerd/workerd.capnp"; const helloWorldExample :Workerd.Config = ( services = [ (name = "main", worker = .helloWorld) ], sockets = [ ( name = "http", address = "*:8080", http = (), service = "main" ) ] ); const helloWorld :Workerd.Worker = ( serviceWorkerScript = embed "worker.js", compatibilityDate = "2022-09-16", );
WorkerScriptはworker.js、サーバは8080番ポートで起動する旨が設定されてます。
worker.jsではfetchイベントを設定してHelloWorldを返してます。
addEventListener('fetch', event => { event.respondWith(handle(event.request)); }); async function handle(request) { return new Response("Hello World\n"); }
workerd serveコマンドでサーバを起動。
コンソールには何もでませんが、起動してます。
% bazel-bin/src/workerd/server/workerd serve samples/helloworld/config.capnp
localhost:8080にアクセスするとレスポンスが返ってきます。
% curl http://localhost:8080 Hello World
Summary
まだβ版でかなり荒削りな部分が多いですが、
ローカルでより正確なworkersの動作を確認できるのは便利です。
また、プログラマブルなプロキシとしても想定されているようなので、
いろいろ使えるのではないでしょうか。